package org.zn.note.java8;

/**
 * 模板方法模式
 * 使用了一个现有算法框架，但是现有的算法又不能完全满足，需要对现有的算法进行改造。
 * <p>
 * 如果用lombok，就不用写实现类，直接给抽象类传入实现方法。
 */
public class Ch08_Pattern_Template {

    public static void main(String[] args) {
        XXXXService a = new AService();
        XXXXService b = new BService();
        a.work();
        b.work();
    }

    /**
     * 这是一套固定的算法框架（流程是一定的）
     * process 1-2-3-4，这个处理流程是固定的
     * 然后给你固定的扩展点，可以在子类中扩展
     */
    private static abstract class XXXXService {
        public void work() {
            // process 1
            System.out.println("process 1");
            // process 2
            process2();
            // process 3
            System.out.println("process 3");
            // process 4
            process4();
        }

        abstract void process2();

        abstract void process4();
    }

    private static class AService extends XXXXService {
        @Override
        void process2() {
            System.out.println("A process2");
        }

        @Override
        void process4() {
            System.out.println("A process4");
        }
    }

    private static class BService extends XXXXService {
        @Override
        void process2() {
            System.out.println("B process2");
        }

        @Override
        void process4() {
            System.out.println("B process4");
        }
    }
}
